iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

Erb and Erubis

當我們在寫 View 時,大家對於 erb 這個名詞應該不陌生, html.erb 讓我們可以在寫 html 的同時,插入 ruby 的語法,我們會使用 <%= %> 這樣的標籤

Erubis 是 Rails 用來執行 Erb 的套件
接下來我們就用它來 render view

在 gemfile 加入 erubis 套件,並且 bundle install

  gem.add_runtime_dependency "rack"
  gem.add_runtime_dependency "erubis"
  gem.add_development_dependency "rack-test"

之後建立一個 test file,並加入下列程式碼

  # some_directory/erb_test.rb
    require "erubis"
    template = << TEMPLATE
    Hello! This is a template.
    It has <%= whatever %>.
    TEMPLATE
    eruby = Erubis::Eruby.new(template)
    puts eruby.src
    puts "=========="
    puts eruby.result(:whatever => "ponies!")

設定完成,我們就可以像 erb 一樣讀取 template 囉

設定 controller

接下來,我們將 controller 引入檔案中,並把之前做的 controller class 刪除

require "rainbow/controller"

在 rainbow/lib/rainbow 建立一個 controller.rb
設定 controller class

module Rainbow
  class Controller
    def initialize(env)
      @env = env 
    end
   
    def env 
      @env
    end 
  end
end

載入 erubis
並定義 render 方法
讓 controller 去找 view

require "erubis"

def render(view_name, locals = {})
  filename = File.join "app", "views", "#{view_name}.html.erb"
  template = File.read filename
  eruby = Erubis::Eruby.new(template)
  eruby.result locals.merge(:env => env)
end

讓 view 更像 view

回到 best_quotes
我們把當初設定的 quote 改以 render 的方式渲染

class QuotesController < Rulers::Controller
  def a_quote
    render :a_quote, :noun => :winking
  end 
end

另外在 best_quotes/app 建立 view 資料夾
增加 a_quote.html.erb 檔案,然後填入 html

<p>
  There is nothing either good or bad but
  <%= noun %> makes it so.
</p>

<p>
  Ruby version <%= RUBY_VERSION %>
</p>

Controller Names

在 Rails , view 檔名會對應到 controller action
所以我們要將 controller 轉換成 snake_case,好讓他可以找到相對應的 view

# rainbow/lib/rainbow/controller.rb:

def controller_name
  klass = self.class
  klass = klass.to_s.gsub /Controller$/, ""
  Rainbow.to_underscore klass

上一篇
Day 11 Automatic Loading (下)
下一篇
Day 13 - 讓 view 更像 view
系列文
從0開始刻 淺談 Rails 的運作魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言